package com.aspire.aimini.model.query;

import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.time.LocalDateTime;
import java.util.List;

/**
 * AI配置查询条件
 *
 * @author wangguiyou
 * @date 2024-12-19
 */
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
public class AiConfigQuery extends BaseQuery {

    /**
     * 用户ID
     */
    private Long userId;

    /**
     * 用户ID列表
     */
    private List<Long> userIds;

    /**
     * 配置名称（模糊查询）
     */
    private String name;

    /**
     * 服务类型
     */
    private String serviceType;

    /**
     * 服务类型列表
     */
    private List<String> serviceTypes;

    /**
     * 服务提供商
     */
    private String provider;

    /**
     * 服务提供商列表
     */
    private List<String> providers;

    /**
     * 模型名称
     */
    private String model;

    /**
     * 模型名称列表
     */
    private List<String> models;

    /**
     * 是否为默认配置
     */
    private Boolean isDefault;

    /**
     * 是否启用
     */
    private Boolean isEnabled;

    /**
     * 最小每日配额
     */
    private Integer minDailyQuota;

    /**
     * 最大每日配额
     */
    private Integer maxDailyQuota;

    /**
     * 最小今日使用量
     */
    private Integer minTodayUsage;

    /**
     * 最大今日使用量
     */
    private Integer maxTodayUsage;

    /**
     * 最小每次调用成本
     */
    private Double minCostPerCall;

    /**
     * 最大每次调用成本
     */
    private Double maxCostPerCall;

    /**
     * 最小优先级
     */
    private Integer minPriority;

    /**
     * 最大优先级
     */
    private Integer maxPriority;

    /**
     * 最小超时时间
     */
    private Integer minTimeout;

    /**
     * 最大超时时间
     */
    private Integer maxTimeout;

    /**
     * 创建时间开始
     */
    private LocalDateTime createTimeStart;

    /**
     * 创建时间结束
     */
    private LocalDateTime createTimeEnd;

    /**
     * 更新时间开始
     */
    private LocalDateTime updateTimeStart;

    /**
     * 更新时间结束
     */
    private LocalDateTime updateTimeEnd;

    /**
     * 描述（模糊查询）
     */
    private String description;

    /**
     * 是否接近配额限制
     */
    private Boolean nearQuotaLimit;

    /**
     * 是否超出配额
     */
    private Boolean quotaExceeded;

    /**
     * 配额使用率范围 - 最小值
     */
    private Double minQuotaUsageRate;

    /**
     * 配额使用率范围 - 最大值
     */
    private Double maxQuotaUsageRate;

    /**
     * 连接状态
     */
    private String connectionStatus;

    /**
     * 连接状态列表
     */
    private List<String> connectionStatuses;

    /**
     * 最后测试时间开始
     */
    private LocalDateTime lastTestTimeStart;

    /**
     * 最后测试时间结束
     */
    private LocalDateTime lastTestTimeEnd;

    /**
     * 是否有最后测试时间
     */
    private Boolean hasLastTestTime;

    /**
     * 最小平均响应时间
     */
    private Long minAvgResponseTime;

    /**
     * 最大平均响应时间
     */
    private Long maxAvgResponseTime;

    /**
     * 最小成功率
     */
    private Double minSuccessRate;

    /**
     * 最大成功率
     */
    private Double maxSuccessRate;

    /**
     * 最小总调用次数
     */
    private Long minTotalCalls;

    /**
     * 最大总调用次数
     */
    private Long maxTotalCalls;

    /**
     * 最后调用时间开始
     */
    private LocalDateTime lastCallTimeStart;

    /**
     * 最后调用时间结束
     */
    private LocalDateTime lastCallTimeEnd;

    /**
     * 是否有最后调用时间
     */
    private Boolean hasLastCallTime;

    /**
     * 是否有错误信息
     */
    private Boolean hasLastError;

    /**
     * 错误信息（模糊查询）
     */
    private String lastError;

    /**
     * 排除的配置ID列表
     */
    private List<Long> excludeIds;

    /**
     * 包含的配置ID列表
     */
    private List<Long> includeIds;

    /**
     * 是否只查询可用配置
     */
    private Boolean onlyAvailable;

    /**
     * 是否只查询系统默认配置
     */
    private Boolean onlySystemDefault;

    /**
     * 是否只查询用户默认配置
     */
    private Boolean onlyUserDefault;

    /**
     * 是否只查询已连接的配置
     */
    private Boolean onlyConnected;

    /**
     * 是否只查询未连接的配置
     */
    private Boolean onlyDisconnected;

    /**
     * 是否只查询高优先级配置（优先级>=8）
     */
    private Boolean onlyHighPriority;

    /**
     * 是否只查询低成本配置（成本<=0.1）
     */
    private Boolean onlyLowCost;

    /**
     * 是否只查询快速响应配置（平均响应时间<=3秒）
     */
    private Boolean onlyFastResponse;

    /**
     * 是否只查询高成功率配置（成功率>=0.9）
     */
    private Boolean onlyHighSuccessRate;

    /**
     * 是否只查询活跃配置（最近7天有调用）
     */
    private Boolean onlyActive;

    /**
     * 是否只查询非活跃配置（最近30天无调用）
     */
    private Boolean onlyInactive;

    /**
     * 检查是否有时间范围查询条件
     */
    public boolean hasTimeRangeCondition() {
        return createTimeStart != null || createTimeEnd != null ||
                updateTimeStart != null || updateTimeEnd != null ||
                lastTestTimeStart != null || lastTestTimeEnd != null ||
                lastCallTimeStart != null || lastCallTimeEnd != null;
    }

    /**
     * 检查是否有配额相关查询条件
     */
    public boolean hasQuotaCondition() {
        return minDailyQuota != null || maxDailyQuota != null ||
                minTodayUsage != null || maxTodayUsage != null ||
                nearQuotaLimit != null || quotaExceeded != null ||
                minQuotaUsageRate != null || maxQuotaUsageRate != null;
    }

    /**
     * 检查是否有性能相关查询条件
     */
    public boolean hasPerformanceCondition() {
        return minAvgResponseTime != null || maxAvgResponseTime != null ||
                minSuccessRate != null || maxSuccessRate != null ||
                onlyFastResponse != null || onlyHighSuccessRate != null;
    }

    /**
     * 检查是否有成本相关查询条件
     */
    public boolean hasCostCondition() {
        return minCostPerCall != null || maxCostPerCall != null ||
                onlyLowCost != null;
    }

    /**
     * 检查是否有状态相关查询条件
     */
    public boolean hasStatusCondition() {
        return isEnabled != null || connectionStatus != null ||
                connectionStatuses != null || onlyAvailable != null ||
                onlyConnected != null || onlyDisconnected != null;
    }

    /**
     * 检查是否有活跃度相关查询条件
     */
    public boolean hasActivityCondition() {
        return hasLastCallTime != null || onlyActive != null ||
                onlyInactive != null || minTotalCalls != null ||
                maxTotalCalls != null;
    }

    /**
     * 获取默认排序字段
     */
    @Override
    public String getDefaultSortField() {
        return "priority";
    }

    /**
     * 获取默认排序方向
     */
    @Override
    public String getDefaultSortDirection() {
        return "DESC";
    }

    /**
     * 获取允许的排序字段
     */
    @Override
    public List<String> getAllowedSortFields() {
        return List.of(
                "id", "name", "serviceType", "provider", "model",
                "isDefault", "isEnabled", "dailyQuota", "todayUsage",
                "costPerCall", "priority", "timeout", "createTime",
                "updateTime", "avgResponseTime", "successRate",
                "totalCalls", "lastCallTime");
    }
}